#include "main.h"

/*单链表初始化。初始化成功函数返回0，否则返回1。*/
int ListInitiate(LNode** head) {
    *head = (LNode*)malloc(sizeof(LNode));
    (*head)->next = NULL;
    if (!*head) {
        return 1;
    }
    return 0;
}

/* 函数返回由head所表示的单链表的长度。*/
int ListLength(LNode* head) {
    LNode* cur = head;
    int size = 0;
    while (cur->next != NULL) {
        cur = cur->next;
        size++;
    }
    return size;
}

// 在由head所表示的单链表里插入一个元素 x 到位置 i。
// 插入成功函数返回0，否则返回1。
int ListInsert(LNode* head, int i, DataType x) {
    LNode* newnode = (LNode*)malloc(sizeof(LNode));
    LNode* posPrev = head;
    int k = -1;
    while (posPrev && k < i - 1) {
        posPrev = posPrev->next;
        k++;
    }
    if (!posPrev || k < i - 1)
    {
        return 1;
    }
    newnode->data = x;
    newnode->next = posPrev->next;
    posPrev->next = newnode;
    return 0;
}

int ListDelete(LNode* head, int i, DataType* x) {
    LNode* p = head;
    int j = -1;
    while (p->next && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!(p->next) || j > i) {
        return 1;
    }
    LNode* pos = p->next;
    p->next = pos->next;
    *x = pos->data;
    free(pos);
    return 0;
}

// 在由head所表示的单链表里获取位置 i 上的元素并将其值存入 x 变量里。调用成功后，列表长度不变。
int ListGet(LNode *head, int i, DataType *x) {
    LNode* prev = head;
    int j = -1;
    while (prev && j < i) {
        prev = prev->next;
        j++;
    }
    if (!prev || j > i) {
        return 1;
    }
    *x = prev->data;
    return 0;
}

// 释放所有的由head所表示的单链表里的元素节点（含头结点）。当释放完全成功时，函数返回0，否则返回1。
int Destroy(LNode** head) {

    LNode* cur = *head;
    LNode* next;
    while (cur) {
        next = cur;
        cur =  cur->next;
        free(next);
    }
    *head = NULL;
    if (*head == NULL) {
        return 0;
    }
    return 1;
}
void main(void) {
    LNode *head;
    int i, x;
    ListInitiate(&head);/*初始化*/
    for (i = 0; i < 10; i++) {
        if (ListInsert(head, i, i + 1) != 0) /*插入10个数据元素*/
        {
            printf("错误! \n");
            return;
        }
    }
    if (ListDelete(head, 4, &x) != 0) { /*删除数据元素5*/
        printf("错误! \n");
        return;
    }
    for (i = 0; i < ListLength(head); i++) {
        if (ListGet(head, i, &x) != 0) /*取元素*/
        {
            printf("错误! \n");
            return;
        } else printf("%d\n", x);/*显示数据元素*/
    }
    Destroy(&head);
}
//